package kzy.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import kzy.common.BaseContext;
import kzy.common.R;
import kzy.dto.SetmealDto;
import kzy.entiy.Category;
import kzy.entiy.Setmeal;
import kzy.entiy.SetmealDish;
import kzy.service.CategoryService;
import kzy.service.SetmealDishService;
import kzy.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import static com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isNotEmpty;

/**
 * 套餐
 * @Author 大溪地
 * @create 2023年05月28日18:21
 */
@Slf4j
@RestController
@RequestMapping("/setmeal")
public class setmealConfig {

    @Autowired
    SetmealService  setmealService;

    @Autowired
    CategoryService categoryService;

    @Autowired
    SetmealDishService setmealDishService;

    @Autowired
    private RedisTemplate redisTemplate;

    public static final Map<String,List<Setmeal>> MAP_DISH_SETMEAL_DTO = new HashMap<>();
    /**
    /**
     * 添加套餐
     * @return
     */
    @CacheEvict(value = "SetmealCache",allEntries = true) //清除缓存中的数据
    @PostMapping()
    public R<String> save(HttpServletRequest request,@RequestBody SetmealDto setmealDto ){
        //获得当前登录用户的id
        Long empId = (Long)request.getSession().getAttribute("employee");
//        获取Session 对象里面的 id 然后  传入给工具class 然后就会执行 自动装配
        BaseContext.setCurrentId(empId);
        setmealService.addSetmeal(setmealDto);
        //        清除缓存
//        Set keys = redisTemplate.keys("Setmeal_*");
//        if (keys != null) {
//            redisTemplate.delete(keys);
//        }
        return R.success("添加成功");
    }

    /**
     * 获取所有的套餐
     * @param request
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(HttpServletRequest request ,Integer page ,Integer pageSize,String name){
//		创建分页构造器对象
        Page pageInfo = new Page(page,pageSize);
        //		2.根据页面提交用户名到数据查询数据  LambdaQueryWrapper  Lambda查询包装器
        LambdaQueryWrapper<Setmeal> queryWrapper =new LambdaQueryWrapper<>();
//		设置条件构造器 设置模糊查询  like 根据 name（套餐名称）进行模糊查询
        queryWrapper.like(isNotEmpty(name),Setmeal::getName, name);
//        根据更新时间进行降序排序
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);

        setmealService.page(pageInfo, queryWrapper);
        List<Setmeal> setmeal =(List<Setmeal>) pageInfo.getRecords();
        for (int i = 0; i < setmeal.size(); i++) {
            Category category = categoryService.getById(setmeal.get(i).getCategoryId());
            setmeal.get(i).setCategoryName(category.getName());
        }
        return R.success(pageInfo);
    }

    /**
     * 根据id修改套餐数据进行回写操作
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<SetmealDto> ModifyThePackageWriteBackBasedOnTheId(@PathVariable("id") Long id){
        // 根据id查询setmeal表中的基本信息
//        Setmeal setmeal = setmealService.getById(id);
//        SetmealDto setmealDto = new SetmealDto();
//        // 对象拷贝。
//        BeanUtils.copyProperties(setmeal, setmealDto);
//        // 查询关联表setmeal_dish的菜品信息
//        LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.eq(SetmealDish::getSetmealId, id);
//        List<SetmealDish> setmealDishList = setmealDishService.list(queryWrapper);
//        //设置套餐菜品属性
//        setmealDto.setSetmealDishes(setmealDishList);
//        return R.success(setmealDto);
////————————————————
        Setmeal setmeal= setmealService.getById(id);
//		2.根据页面提交id到数据查询数据  LambdaQueryWrapper  Lambda查询包装器
        LambdaQueryWrapper<SetmealDish> queryWrapper =new LambdaQueryWrapper<>();
//		设置条件构造器 设置查询   根据 id（套餐id）进行查询
        queryWrapper.eq( SetmealDish::getSetmealId, id);
        List<SetmealDish> list = setmealDishService.list(queryWrapper);
        SetmealDto setmealDto=new SetmealDto();
        // 对象拷贝。
        BeanUtils.copyProperties(setmeal, setmealDto);
        setmealDto.setSetmealDishes(list);
        log.info(setmealDto.toString());
        return R.success(setmealDto);
    }


    /**
     * 根据id起售或者停售菜品
     * @param ids
     * @return
     */
    @CacheEvict(value = "SetmealCache",allEntries = true) //清除缓存中的数据
    @PostMapping("/status/{status}")
    public R<String> status(HttpServletRequest request,@PathVariable("status") Integer status, Long[] ids){
//        获取Session里面的当前登录的id
        Long empId = (Long)request.getSession().getAttribute("employee");
//		传入 id 自动装配的class 会进行自动装配
        BaseContext.setCurrentId(empId);
        for (int i = 0; i < ids.length; i++) {
//            根据id先获取套餐基本信息的数据
            Setmeal setmeal = setmealService.getById(ids[i]);
//            设置起售或者停售
            setmeal.setStatus(status);
//           在把修改完的数据写回数据库
            setmealService.updateById(setmeal);
        }
        //        清除缓存
//        Set keys = redisTemplate.keys("Setmeal_*");
//        if (keys != null) {
//            redisTemplate.delete(keys);
//        }
        return R.success("修改成功");
    }



    /**
     * 根据id删除菜品
     * @param ids
     * @return
     */
    @CacheEvict(value = "SetmealCache",allEntries = true) //清除缓存中的数据
    @DeleteMapping
    public R<String> DeleteById(Long[] ids){
        String name="";
        for (int i = 0; i < ids.length; i++) {
//		2.根据页面提交id到数据查询数据  LambdaQueryWrapper  Lambda查询包装器
            LambdaQueryWrapper<SetmealDish> queryWrapper =new LambdaQueryWrapper<>();
//		设置条件构造器 设置模糊查询  eq 根据 getDishId（套餐id）进行查询
            queryWrapper.eq( SetmealDish::getSetmealId, ids[i]);
//            先根据id获取套餐的基本信息
            Setmeal setmeal = setmealService.getById(ids[i]);
//           setmeal.getStatus()==0  状态为0（停售）才可以删除
            if(setmeal.getStatus()==0){
//            删除套餐的基本信息
                setmealService.removeById(ids[i]);
//            删除套餐里面对象的菜品信息
                setmealDishService.remove(queryWrapper);
            }else{
                name=setmeal.getName()+",";
                return R.error(name+"要先停售,才可以删除，其他套餐已经删除成功");
            }
        }
        //        清除缓存
//        Set keys = redisTemplate.keys("Setmeal_*");
//        if (keys != null) {
//            redisTemplate.delete(keys);
//        }
            return R.success("全部删除成功");

    }

    /**
     * 修改套餐
     * @return
     */
    @CacheEvict(value = "SetmealCache",allEntries = true) //清除缓存中的数据
    @PutMapping()
    public R<String> UpdateSetmeal(HttpServletRequest request,@RequestBody SetmealDto setmealDto ){
        //获得当前登录用户的id
        Long empId = (Long)request.getSession().getAttribute("employee");
//        获取Session 对象里面的 id 然后  传入给工具class 然后就会执行 自动装配
        BaseContext.setCurrentId(empId);
        setmealService.updateById(setmealDto);
        //		2.根据页面提交id到数据查询数据  LambdaQueryWrapper  Lambda查询包装器
        LambdaQueryWrapper<SetmealDish> queryWrapper =new LambdaQueryWrapper<>();
//		设置条件构造器 设置模糊查询  eq 根据 getDishId（套餐id）进行查询
        queryWrapper.eq( SetmealDish::getSetmealId, setmealDto.getId());
//      删除该套餐里面的菜品信息
        setmealDishService.remove(queryWrapper);
//        获得传入的菜品信息
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
//        遍历菜品集合
        for (int i = 0; i < setmealDishes.size(); i++) {
//        逐个设置这些菜品属于 该套餐底下
            setmealDishes.get(i).setSetmealId(setmealDto.getId());
        }
//        批量保存这些菜品信息
        setmealDishService.saveBatch(setmealDishes);
////        清除缓存
//        Set keys = redisTemplate.keys("Setmeal_*");
//        if (keys != null) {
//            redisTemplate.delete(keys);
//        }
        return R.success("修改成功");
    }

    @Cacheable(value="SetmealCache",key="#categoryId+'_'")
    @GetMapping("/list")
    public R<List<Setmeal>> list(Long categoryId){
//        String key = "Setmeal_"+categoryId + "_" + "_1";
        //判断redis中是否有菜品数据，如果有则直接返回。
//        String value = (String) redisTemplate.opsForValue().get(key);
//        if (value != null ) {
//            if(MAP_DISH_SETMEAL_DTO.get(value)!=null){
//                return R.success(MAP_DISH_SETMEAL_DTO.get(value));
//
//            }
//        }
        LambdaQueryWrapper<Setmeal> queryWrapper =new LambdaQueryWrapper<>();
//		设置条件构造器 设置模糊查询  eq 根据 getDishId（套餐id）进行查询
        queryWrapper.eq( categoryId!=null,Setmeal::getCategoryId, categoryId);
//      获取该套餐里面的菜品信息
        List<Setmeal> list = setmealService.list(queryWrapper);
//		添加缓存数据到ListDishDto里面去
//        MAP_DISH_SETMEAL_DTO.put(key,list);
//		如果 redis 查询 kye  返回值为 null 那么就先查询数据  然后添加到redis 菜品缓存里面
//        redisTemplate.opsForValue().set(key,key,60, TimeUnit.MINUTES);
        return  R.success(list);
    }

}
